/*
 * Copyright 2019 Web3 Labs Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package org.web3j.crypto;

import org.web3j.utils.Numeric;

/** Credentials wrapper. */
public class Credentials {

	private final ECKeyPair ecKeyPair;
	private final String address;

	private Credentials(ECKeyPair ecKeyPair, String address) {
		this.ecKeyPair = ecKeyPair;
		this.address = address;
	}

	public ECKeyPair getEcKeyPair() {
		return ecKeyPair;
	}

	public String getAddress() {
		return address;
	}

	public static Credentials create(ECKeyPair ecKeyPair) {
		String address = Numeric.prependHexPrefix(Keys.getAddress(ecKeyPair));
		return new Credentials(ecKeyPair, address);
	}

	public static Credentials create(String privateKey, String publicKey) {
		return create(new ECKeyPair(Numeric.toBigInt(privateKey), Numeric.toBigInt(publicKey)));
	}

	public static Credentials create(String privateKey) {
		return create(ECKeyPair.create(Numeric.toBigInt(privateKey)));
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) {
			return true;
		}
		if (o == null || getClass() != o.getClass()) {
			return false;
		}

		Credentials that = (Credentials) o;

		if (ecKeyPair != null ? !ecKeyPair.equals(that.ecKeyPair) : that.ecKeyPair != null) {
			return false;
		}

		return address != null ? address.equals(that.address) : that.address == null;
	}

	@Override
	public int hashCode() {
		int result = ecKeyPair != null ? ecKeyPair.hashCode() : 0;
		result = 31 * result + (address != null ? address.hashCode() : 0);
		return result;
	}
}
